package com.xzm;

public class LazySingletonTest{
    public static void main(String[]args){
        new Thread(()->{
            LazySingleton instance1 = LazySingleton.getInstance();
            System.out.println(instance1);
        }).start();
        new Thread(()->{
            LazySingleton instance1 = LazySingleton.getInstance();
            System.out.println(instance1);
        }).start();
    }
}

class LazySingleton{
    private volatile static LazySingleton instance;
    private LazySingleton(){
        if(instance!=null){
            throw new RuntimeException("已经有实例化对象.");
        }
    }
    public   static LazySingleton getInstance(){
        if(instance==null){
            synchronized (LazySingleton.class) {
                if (instance == null) {
                    instance = new LazySingleton();
                    /*字节码文件：分配空间、初始化、引用复制，但是底层如CPU，编译器可能优化，会导致问题
                    如，顺序是分配空间、引用复制、初始化，这样第二步完成，第三步未开始，多了线程，得到的对象是没有初始化的
                    这样就会抛出空指针异常，可以在变量前加入volatile关键字，防止指令重排序*/
                }
            }
        }
        return instance;
    }
}
